package top.leinx.fxnotes.paint;

/**
 * @Author : xiaolei
 * @DateTime: 2021/3/28 8:30 上午
 */

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class LinearGradientExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        FlowPane pane = new FlowPane(5.0, 5.0);
        pane.setPadding(new Insets(5, 5, 5, 5));

        // 创建多个矩形
        Rectangle[] rectangles = new Rectangle[6];
        for (int i = 0; i < rectangles.length; i++) {
            rectangles[i] = new Rectangle(0, 0, 200, 200);
            rectangles[i].setStroke(Color.BLACK); // 黑色边框
        }

        // 创建渐变的停止点数组，这里只指定了起点和终点2个停止点，线形渐变对象会用插值方式生成渐变过程中的颜色
        Stop[] stops = new Stop[]{new Stop(0, Color.BLUE),  new Stop(1, Color.RED)};

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 被填充形状的X轴方向从0%到100%整个范围渐变，Y轴方式不渐变，剩余部分用停止点的终点填充。
        // 当然本例无剩余部分。
        LinearGradient lg1 = new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, stops);
        rectangles[0].setFill(lg1);  // 填充第一个矩形

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 被填充形状的X轴方向从0%到50%范围渐变，Y轴方式不渐变，剩余部分50%到100%用停止点的终点填充。
        LinearGradient lg2 = new LinearGradient(0, 0, 0.5, 0, true, CycleMethod.NO_CYCLE, stops);
        rectangles[1].setFill(lg2);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 被填充形状的X轴方向从0%到50%范围渐变，Y轴方式不渐变，剩余部分50%到100%用对称方式填充。
        LinearGradient lg3 = new LinearGradient(0, 0, 0.5, 0, true, CycleMethod.REFLECT, stops);
        rectangles[2].setFill(lg3);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 被填充形状的X轴方向从0%到25%范围渐变，Y轴方式不渐变，剩余部分25%到100%用重复方式（3次）填充。
        LinearGradient lg4 = new LinearGradient(0, 0, 0.25, 0, true, CycleMethod.REPEAT, stops);
        rectangles[3].setFill(lg4);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 被填充形状的X轴方向从0%到100%整个范围渐变，Y轴方式从0%到100%整个范围渐变，
        // 无剩余部分。
        LinearGradient lg5 = new LinearGradient(0, 0, 1, 1, true, CycleMethod.NO_CYCLE, stops);
        rectangles[4].setFill(lg5);

        // 使用stops的停止点创建线性渐变对象，使用像素方式。
        // 被填充形状的X轴方向从50到150范围渐变，Y轴方式从50到150范围渐变，
        // 剩余部分X轴和Y轴的0到50用stops[0]填充，150-200用stops[1]填充。
        LinearGradient lg6 = new LinearGradient(50, 50, 150, 150, false, CycleMethod.NO_CYCLE, stops);
        rectangles[5].setFill(lg6);

        // 填充圆
        LinearGradient lg7 = new LinearGradient(0, 1, 1, 0, true, CycleMethod.NO_CYCLE, stops);
        Circle circle = new Circle(100.0);
        circle.setFill(lg7);

        // 填充多边形-三角形
        LinearGradient lg8 = new LinearGradient(1, 0, 1, 1, true, CycleMethod.NO_CYCLE, stops);
        Polygon triangle = new Polygon(100.0, 0.0, 0.0, 200.0, 200.0, 200.0);
        triangle.setFill(lg8);

        // 填充多边形-八边形
        LinearGradient lg9 = new LinearGradient(1, 1, 0, 0, true, CycleMethod.NO_CYCLE, stops);
        Polygon octagon = new Polygon(
                200 / 3.0, 0, 400 / 3.0, 0,
                200, 200 / 3.0, 200, 400 / 3.0,
                400 / 3.0, 200, 200 / 3.0, 200,
                0, 400 / 3.0, 2, 200 / 3.0
        );
        octagon.setFill(lg9);

        pane.getChildren().addAll(rectangles);
        pane.getChildren().add(circle);
        pane.getChildren().add(triangle);
        pane.getChildren().add(octagon);

        primaryStage.setTitle("Paint - LinearGradient 填充示例");
        primaryStage.setScene(new Scene(pane, 640, 640));
        primaryStage.show();
    }

}

